package GUI;

import Model.Gates.Gate;
import Model.Inputs.Input;
import Model.Main.Wire;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Logger;
import javax.imageio.ImageIO;

/**
 * A gyerek osztálynak meg kell valósítania:
 *  * Konstruktorban betölteni a file listát, vagy filet, ami őt reprezentálja
 *  * Az aktuális ilyen filet az img-ben tárolni
 *  * A setState függvénnyel ezt megváltoztatni ha szükséges
 *
 *
 *       FONTOS!!! minden png transparent backgrounddal menjen ki!
 *
 * @author bg
 */
public class AbstractElementView extends MouseAdapter {

    Point position = new Point();
    Dimension preferredImageSize = new Dimension();
    ArrayList<Point> inputs=null;
    ArrayList<Point> outputs=null;
    BufferedImage img = null;
    Boolean state = false;
    String fileName;
    private static final Logger logger =
            Logger.getLogger(AbstractElementView.class.getName());

    public Point getPosition() {
        return this.position;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println(this.getClass().getName());
    }

    /**
     * set position
     * @param p the position to set
     */
    public void setPositon(Point p) {
        this.position = p;
    }

    /**
     * Visszaadja a képet BufferedImage-ként.
     * @return
     * @throws Exception
     */
    public BufferedImage getImage() throws Exception {
        if (img == null) {
            throw new Exception("Double buffered image not dedined in " + this);
        }
        return img;
    }

    /**
     * Visszaadja a méretét a képnek ami az objektumot reprezentálja
     * @return Dimension
     * @throws Exception ha nincs kép 
     */
    public Dimension getPreferredSize() throws Exception {
        if (img == null) {
            throw new Exception("No image in this object error!");
        } else {
            return new Dimension(img.getWidth(), img.getHeight());
        }
    }

    /**
     * visszaadja az állapotot
     * @return 
     */
    Boolean getState() {
        return state;
    }

    /**
     * Ha rákattintunk akkor ez fut le
     */
    void click() {
        return;
    }

    /**
     * A led kijelzők friossítése
     */
    void tick() {
        return;
    }
    /**
     * Beállítja az állapotot. Ez egyben a refresh is. Felüldefiniálandó.
     * @param st 
     */
    void setState(Boolean st) {
        state = st;
    }
    /*
     * A kimeneti wire beállítása.
     */

    void setOutputWireModel(Wire w, int inputNumber) {
    }
    /*
     * A logikai gate visszadása
     */

    Gate getGate() {
        return(null);
    }
    Input getInput() {
        return(null);
    }
    void paint(Graphics2D g2d) {
        g2d.drawImage(img, null, position.x, position.y);
        if (inputs != null) {
            for (Point input : inputs) {
                g2d.drawRect(input.x - 5, input.y - 2, 5, 5);
            }
        }
        if (outputs != null) {
            for (Point output : outputs) {
                g2d.drawRect(output.x, output.y - 2, 5, 5);
            }
        }
    }
}
